﻿#ifndef __AF_LOG_H__
#define __AF_LOG_H__

#define AF_FILE		__FILE__
#define AF_LINE		__LINE__
#define AF_FUNCTION	__FUNCTION__
#define AF_ENTER	"\n"
#define AF_TAB		"\t"

#ifdef AF_WIN32
#pragma warning(disable:4390)
#endif

#ifdef AF_DEBUG
#define AF_LOGTOFILE(_strFileName)	AF::g_Log.ToFile(_strFileName)
#define AF_CLOSELOGFILE(_nTemp)		AF::g_Log.CloseFile()
#define AF_MARK(_nTemp)			AF::g_Log.ConsoleOut("", AF::LOG_MARK, AF_FILE, AF_LINE, "")

#if defined(AF_WIN32)
#define AF_LOG(_str, ...)		AF::g_Log.ConsoleOut(_str, AF::LOG_LOG, AF_FILE, AF_LINE, __VA_ARGS__)
#define AF_WARM(_str, ...)		AF::g_Log.ConsoleOut(_str, AF::LOG_WARM, "", 0, __VA_ARGS__)
#define AF_NOTE(_str, ...)		AF::g_Log.ConsoleOut(_str, AF::LOG_NOTE, "", 0, __VA_ARGS__)
#define AF_ERROR(_str, ...)		AF::g_Log.ConsoleOut(_str, AF::LOG_ERROR, AF_FILE, AF_LINE, __VA_ARGS__)
#elif defined(AF_LINUX)
#define AF_LOG(_str, ...)		AF::g_Log.ConsoleOut(_str, AF::LOG_LOG, AF_FILE, AF_LINE, __VA_ARGS__)
#define AF_WARM(_str, ...)		AF::g_Log.ConsoleOut(_str, AF::LOG_WARM, "", 0, __VA_ARGS__)
#define AF_NOTE(_str, ...)		AF::g_Log.ConsoleOut(_str, AF::LOG_NOTE, "", 0, __VA_ARGS__)
#define AF_ERROR(_str, ...)		AF::g_Log.ConsoleOut(_str, AF::LOG_ERROR, AF_FILE, AF_LINE, __VA_ARGS__)
#endif

#else /*AF_DEBUG*/
#define AF_LOGTOFILE(_strFileName)
#define AF_CLOSELOGFILE(_Temp)
#define AF_MARK(_Temp)
#define AF_LOG(_str, ...)
#define AF_WARM(_str, ...)
#define AF_NOTE(_str, ...)
#define AF_ERROR(_str, ...)
#endif /*AF_DEBUG*/

#define AF_ERRMARK()			AF_ERROR("", "")

#include "AF_Define.h"

#ifdef AF_DEBUG

namespace AF
{
	class Log;
}
typedef AF::Log			AF_CLog;

namespace AF
{
	/// 调试信息类型
	enum LogType
	{
		/// 标注，输出任意信息
		LOG_NOTE,
		/// 提示，输出信息，有换行，无位置
		LOG_WARM,
		/// 批注，输出信息，有换行，有位置
		LOG_LOG,
		/// 标记，只输出位置
		LOG_MARK,
		/// 错误，输出错误信息，有换行，有位置
		LOG_ERROR
	};
}
typedef AF::LogType		AF_ELogType;
#define AF_LOG_NOTE		AF::LOG_NOTE
#define AF_LOG_WARM		AF::LOG_WARM
#define AF_LOG_LOG		AF::LOG_LOG
#define AF_LOG_MARK		AF::LOG_MARK
#define AF_LOG_ERROR		AF::LOG_ERROR

namespace AF
{
	/// 调试信息类
	class Log
	{
	public:
		Log();
		~Log();

		/// 控制台输出
		void		ConsoleOut(_STRING strText, LogType ltType, _STRING strFile, int nLine, ...);

		/// 输出到文件
		void		ToFile(_STRING strFileName);
		/// 关闭输出文件
		void		CloseFile();

	private:
		void		CreateMark(_STRING strFile, int nLine);
		void		WriteFile(_STRING strText);

	private:
		_STRING		m_strConsoleText;

		bool		m_isFile;
		std::ofstream	m_ofLogFile;
	};

	/// 全局调试信息实例
	extern Log g_Log;

}
#endif /*AF_DEBUG*/

#endif
